/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package praticav.dao;

import praticav.model.AtividadesPlanejadas;
import praticav.util.HibernateUtil;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import praticav.model.AtividadesPlanejadasPK;
import praticav.model.Producao;

/**
 * @author Katiane
 */
public class AtividadesPlanejadasDAO {
  public AtividadesPlanejadasDAO() {
  sessao = HibernateUtil.getsession();
  }
    
  private Session sessao;
  
  public void inserir(AtividadesPlanejadas c) {
    Transaction t = sessao.beginTransaction();
    //Busca sequencial para o projeto
    Producao p = new ProducaoDAO().buscar(c.getChave().getFase().getChave().getProducao().getProcodigo());
    c.setAtiplansequencial(p.getProsequencia());
    AtividadesPlanejadasPK chave = new AtividadesPlanejadasPK();
    chave = c.getChave();
    chave.setAtiplanCodigo(Integer.parseInt(""+getMaxID(c.getChave().getFase().getChave().getProducao().getProcodigo(), c.getChave().getFase().getChave().getFascodigo()))+1);
    c.setChave(chave);
    sessao.save(c);
    t.commit();
    //Atualiza o sequencial do projeto
    p.setProsequencia(p.getProsequencia()+1);
    ProducaoDAO daoProd = new ProducaoDAO();
    daoProd.editar(p);
  }
  
  public void editar(AtividadesPlanejadas c) {
    Transaction t = sessao.beginTransaction();
    sessao.merge(c);
    t.commit();    
  }
  
  public void excluir(AtividadesPlanejadas c) {
    Transaction t = sessao.beginTransaction();
    sessao.delete(c);
    t.commit();
  }
  
  public AtividadesPlanejadas buscar(AtividadesPlanejadasPK chave){
      
    return (AtividadesPlanejadas) sessao.load(AtividadesPlanejadas.class, chave);
  }   
  
  public List<AtividadesPlanejadas> listar() {
    Query qu = sessao.createQuery("from AtividadesPlanejadas"); 
    return qu.list();
  }
  
public List<AtividadesPlanejadas> listar(int ProCodigo, int FasCodigo, int AtiCodigo, String AtiDescricao, String DtaInicialInicial, String DtaInicialFinal, String DtaFinalInicial, String DtaFinalFinal) {
  String condicoes = "";
  Integer primeiro=0;
  if (ProCodigo > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      
      condicoes += "ProCodigo = "+ProCodigo;
  }
  if (FasCodigo > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";      
      condicoes += "FasCodigo = "+FasCodigo;  
  }
  if (AtiCodigo > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";      
      condicoes += "AtiPlanCodigo = "+AtiCodigo;  
  }
  if (AtiDescricao.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "AtiPlanDescricao like %'"+AtiDescricao+"'";    
  }
  if (DtaInicialInicial.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "AtiPlanDtaInicial >= '"+DtaInicialInicial+"'";      
  }
  if (DtaInicialFinal.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "AtiPlanDtaInicial <= '"+DtaInicialFinal+"'";      
  }  
  if (DtaFinalInicial.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "AtiPlanDtaFinal >= '"+DtaFinalInicial+"'";      
  }
  if (DtaFinalFinal.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "AtiPlanDtaFinal <= '"+DtaFinalFinal+"'";      
  }  
    Query qu = sessao.createQuery("from AtividadesPlanejadas"+condicoes +" order by AtiPlanSequencial"); 
    return qu.list();
  }  


  public List<AtividadesPlanejadas> listar(int ProCodigo, int Predecessor) {
    Query qu = sessao.createQuery("from AtividadesPlanejadas where ProCodigo = "+ProCodigo + " and AtiPlanPredecessor = "+Predecessor); 
    return qu.list();
  }

  
  public List<AtividadesPlanejadas> listar(int ProCodigo) {
    Query qu = sessao.createSQLQuery("Select f.fasdescricao, at.*, coalesce((select sum(apr.aprquantidade*apr.aprvalorunitario)"
                                                                                                                + "from atividadesplanejadas_recursos apr "
                                                                                                                + "where apr.atiplancodigo = at.atiplancodigo "
                                                                                                                + "and apr.fascodigo = f.fascodigo "
                                                                                                                + "and apr.procodigo = "+ProCodigo+"),0) aticusto"
                                    + " from atividadesplanejadas at, fases f"
                                    + " where f.FasCodigo = at.FasCodigo and at.ProCodigo = "+ProCodigo+" and f.procodigo = "+ProCodigo+""
                                    + " order by f.fascodigo, at.atiplancodigo").addEntity("at",AtividadesPlanejadas.class); 

    //Query qu = sessao.createSQLQuery("Select * from fases ");
    /*
     * Select f.fascodigo, f.fasdescricao, at.atiplancodigo, at.atiplandescricao, (select sum(apr.aprquantidade*apr.aprvalorunitario) 
								            from atividadesplanejadas_recursos apr 
								            where apr.atiplancodigo = at.atiplancodigo 
								              and apr.fascodigo = f.fascodigo 
								              and apr.procodigo = 1) aticusto
    from atividadesplanejadas at, fases f
    where f.FasCodigo = at.FasCodigo and at.ProCodigo = 1 and f.procodigo = 1
    order by f.fascodigo, at.atiplancodigo
     */
    return qu.list();
  }  
    private int getMaxID(int ProCodigo, int FasCodigo)  
    {  
        Object obj = sessao.createSQLQuery("SELECT MAX(AtiPlanCodigo) FROM AtividadesPlanejadas where ProCodigo = "+ProCodigo + " and FasCodigo = "+FasCodigo).uniqueResult();  
        if(obj==null)  
            return 0;  
        return Integer.parseInt( obj.toString());  
    }   
}